/**
*******************************************************
*@file  rs485.h 
*@brief rs485.h 
*@author 花满楼
*@date     2020-7-1 
*@version  V1
*@note 485通讯底层的定义
*******************************************************
*/
#ifndef __RS485_H
#define __RS485_H
#include "sys.h"


#ifndef RATED_CAPACITY  
	#define RATED_CAPACITY 75		//7.5Ah,放大10倍
#endif

#ifndef UART_Bound
    #define UART_Bound 9600	///<通讯速率
#endif

#ifndef RS485_RX_EN
	#define RS485_RX_EN PDout(8)   ///< 1:不接收  0:接收
#endif

#ifndef RS485_WR_EN
	#define RS485_WR_EN PDout(9)   ///< 1:发送  0:不发送
#endif

/**
  * @brief  电芯材质
  */
typedef enum
{
    TERNARY      = 0,  ///<三元锂
    PHOSPHATE    = 1,  ///<磷酸铁锂
    COBALT  	 = 2,  ///<钴酸锂
    MANGANATE    = 3,  ///<锰酸锂
	TITANATE     = 4	 ///<钛酸锂
} Cell_Type;
/**@} */

/**@name   UPS控制指令结构体
* @{
*/
typedef struct _Control_Register_Group
{
	union
	{
		struct
		{
			u16 Relay_Charge			:2; //充电继电器状态，0：不做处理；1：断开；2：闭合
			u16 Relay_DisCharge			:2;	//放电继电器状态
			u16 Relay_PreCharge			:2;	//预充继电器状态
			u16 Relay_Power				:2;	//辅源继电器状态
			u16 Relay_Fan				:2;	//风扇继电器状态
			u16	Led_State				:2;	//LED灯的状态		0：不做处理；1：全亮；2：全灭； 注：工厂检测用
			u16 RSVD					:4; //保留
		}Bit;
		u16 Word;
	}Control1;
	
	union
	{
		struct
		{
			u16 SOC_State		:7; //SOC状态 0-100
			u16 Correct_SOC		:1;	// 0：不做处理;1：执行SOC修正BIT0-6的值
			u16 SOH_State		:7;	//SOH状态 0-100
			u16 Correct_SOH		:1; // 0：不做处理;1：执行SOH修正BIT8-14的值
		}Bit;
		u16 Word;
	}Control2;
	
	union
	{
		struct
		{
			u16 BMS_State				:2; //BMS工作状态，0：不处理；1：2min后BMS下电（2min内可接受正常工作命令，后继续工作）;
											//   2：BMS正常工作
			u16 LED_Flick				:1;	//LED灯同步闪烁，0：不处理；1：执行计数器同步						
			u16 RSVD					:15; //保留
		}Bit;
		u16 Word;
	}Control3;
	
	union
	{
		struct
		{
			u16 RSVD					:16; //保留
		}Bit;
		u16 Word;
	}Control4;
	

}_Control_RegisterGroup;
extern _Control_RegisterGroup Control_Reg;	///<结构体句柄
/**@} */

extern u8 RS485_RX_BUF[64];     ///<接收缓冲,最大64个字节
extern u8 RS485_TX_BUF[100];
extern u8 Flag_RX_485;      	///<1--接收到一帧校验正确的数据但尚未响应
extern u16 Alarm_Data[10];      ///<MODBUS整型数据    对应clecet中的地址
extern u16 Control_Date[10];	/**< MODBUS的控制量*/
extern u16 Set_Dress[20];  		///<设置地址
extern u16 Analog_Data[150];	///<模拟量的485通讯数组
extern u8 Flag_ParaChange_485 ; ///<1--触摸屏向DSP写数据
extern u8 Pack_Addr;	/**<模组地址*/

extern u8 cell_id_hex[20]; /**<电芯的ID*/



void Collect(void);	///<数据更新函数



void RS485_Init(u32 bound);
void RS485_Send_Data(u8 *buf, u8 len);
void RS485_Receive_Data(u8 *buf, u8 *len);
u16 CRC16(u8 *puchMsg, u16 usDataLen);
u8 RS485_Data(void);
void Refresh(void);		///<接收数据刷新寄存器
void Get_Address(void);		//获取设备的地址
void HextoASCII(u8 *Origin,u8 *Target,u16 Lenth);//HEX转ASCII
void ASCIItoHex(u8 *Origin,u8 *Target,u8 Lenth);//ASCII转HEX


#endif
